package com.campus_information_portal.service.impl;

import com.campus_information_portal.dao.ExemptionDao;
import com.campus_information_portal.entity.*;
import com.campus_information_portal.service.ExemptionService;
import com.campus_information_portal.util.ExemptionTime;
import com.campus_information_portal.util.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

@Service
public class ExemptionImpl implements ExemptionService {
    @Autowired
    private ExemptionDao exemptionDao;

    /* *
     * @param  * @param stu_Info_Id
     * @Description  查询六级成绩
     * @methodName queryCet6
     * @author 20155873 张联富
     * @date 2018/4/19 14:39
     * @return int
     */
    public int queryCet6(int stu_Info_Id) {

        int cet6 = exemptionDao.queryCet6(stu_Info_Id);
        return cet6;
    }

    /*
     * @param  * @param
     * @Description 分页查询 免修记录
     * @methodName
     * @author 20155873 张联富
     * @date 2018/4/19 14:49
     * @return
     */
    @Override
    public void queryAllExemption(PageInfo<Exemption> pageinfo, int exemption_Flag) {
        List<Exemption> list = null;
        Long count = null;
        count = exemptionDao.obtainCount();
        System.out.println("---" + count);
        pageinfo.setCount(count.intValue());
        pageinfo.setPageIndex((pageinfo.getPageIndex() - 1) * pageinfo.pageSize);
        // list=exemptionDao.queryAllExemption(pageinfo.getPageIndex(), pageinfo.pageSize,exemption_Flag);
        pageinfo.setPageList(exemptionDao.queryAllExemption(pageinfo.getPageIndex(), pageinfo.pageSize, exemption_Flag));
    }


    /* *
     * @param exemption_id
     * @Description 处理免修（批准 退回）
     * @methodName
     * @author 20155873 张联富
     * @date 2018/4/19 14:50
     * @return
     */
    @Override
    public void manageExemption(int exemption_id, int exemption_Flag) {
        Date time = ExemptionTime.getNetworkTime();
        exemptionDao.manageExemption(exemption_id, exemption_Flag, time);

    }

    /* *
   * @param stu_info_id
 * @param exemption_reason
  * @Description  申请免修
  * @methodName
 * @author 20155873 张联富
  * @date 2018/4/19 14:50
 * @return
        */
    @Override
    public void addExemption(int stu_info_id) {
        Date time = ExemptionTime.getNetworkTime();
        exemptionDao.addExemption(stu_info_id,time);
    }


    /* *
     * @param stu_info_id
     * @Description 查询免修表中某个同学的所有记录
     * @methodName selectExemptionByid
     * @author 20155873 张联富
     * @date 2018/4/19 14:51
     * @return
     */
    public List<Exemption> selectExemptionByid(int stu_info_id) {
        List<Exemption> e = exemptionDao.selectExemptionByid(stu_info_id);
        return e;
    }

    //判断是否能够申请免修
    public int IsApply(int stu_Info_Id) {
        // flag=0; 6级未参加
        // flag=1; 6级参加过，但没达到425
        //flag = 2;6级通过，但从未申请过，有资格申请
        //flag = 3；申请被批准 ，无法再次申请
        //flag = 4；正在处理中，无法再次申请
        //flag=5;  //2月  78月 为放假月，不管是否有申请资格，无法进行申请
        //flag = 6; //可以再次申请
        // flag = 7; //不可以申请  同一学期不能申请第二次，请等到下学期再申请
        int flag = 0;//没有申请资格
        int cet6 = exemptionDao.queryCet6(stu_Info_Id);
        System.out.println("stu_Info_Id="+stu_Info_Id);
        System.out.println("cet6="+cet6);
        Exemption e = null;
        if (cet6 >= 425) {
            List<Exemption> elist = exemptionDao.selectExemptionByid(stu_Info_Id);

            //获取当前标准时间
            Date time = ExemptionTime.getNetworkTime();
            Calendar NowCalendar = Calendar.getInstance();
            NowCalendar.setTime(time);
            //获取当前标准年份，月份，用于比较时间差，判断是否进入到了下个学期
            int NowYear = NowCalendar.get(Calendar.YEAR);
            int month = NowCalendar.get(Calendar.MONTH) + 1;



            if (month == 2 || month == 7 || month == 8) {//2月  78月 为放假月， 无法进行申请
                return flag = 5;  //2月  78月 为放假月， 无法进行申请  查看之前的申请记录

            } else {
                if (elist.size() > 0) {//若之前申请过免修，存在免修记录

                    //找到最新的免修记录来判断现在是否能申请免修
                    e = exemptionDao.findMaxExemptionId(stu_Info_Id);

                    // 退回则有可能可以再次申请   批准则无法再次申请
                    if (e.getExemptionFlag() == 1) {//被批准  无法再次申请
                      return  flag = 3;
                    } else if (e.getExemptionFlag() == 0) {//正在处理中，无法再次申请
                        return  flag = 4;
                    } else if (e.getExemptionFlag() == 2) {//被退回 本学期不能再次申请，下学期及以后才能继续申请

                        //获取申请时间
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(e.getApplyTime());
                        //获取申请月份
                        int apllyMonth = calendar.get(Calendar.MONTH) + 1;
                        //获取申请年份
                        int apllyYear = calendar.get(Calendar.YEAR);
                        //① 上次申请时间为1-2月时
                        if (apllyMonth <= 2) {
                            if (apllyYear < NowYear) {//再次申请时间已到下一年或以后
                                return flag = 6; //可以再次申请
                            } else if (apllyYear == NowYear) {
                                if (month <= 1) {
                                    return  flag = 7; //不可以申请  同一学期不能申请第二次，请等到下学期再申请
                                } else
                                    return  flag = 6; //可以再次申请
                            }
                        }
                        //②上次申请时间是9-12月时
                        //若在今年上学期（今年9月到下一年2月内）再次申请，则需要等到本学年的下学期（下一年3月）及以后才能申请
                        if (apllyMonth >= 9) {
                            if (apllyYear < NowYear) {// 再次申请时间在上一次申请时间的下一年及以后时   需要判断是否是同一学期
                                if (apllyYear + 1 == NowYear) {//如果再次申请时间是上次申请的时候的下一年
                                    if (month <= 1) {//若是同一学期，则不能申请
                                        return  flag = 7; //不可以申请  同一学期不能申请第二次，请等到下学期再申请
                                    } else {//不是同一学期，可以申请
                                        return   flag = 6; //可以再次申请
                                    }
                                } else { //上一次申请时间是现在申请时间的前两年及以上时
                                    return   flag = 6; //可以再次申请
                                }

                            } else {//再次申请时间还在本学期
                                return  flag = 7; //不可以申请  同一学期不能申请第二次，请等到下学期再申请
                            }
                        }
                        //③上次申请时间是3-6月时
                        //若在3-6月申请，则本年9月以后或者下一年或以后才能申请
                        if (apllyMonth <= 6 && apllyMonth >= 3) {
                            System.out.println("3-6yue");
                            if (apllyYear < NowYear) {//再次申请时间已到下一年或以后
                               return flag = 6; //可以再次申请
                            }
                            if (apllyYear == NowYear) {//再次申请时间在本年
                                if (apllyMonth >= 9) {
                                    return  flag = 6; //可以再次申请
                                } else {
                                   return  flag = 7; //不可以申请  同一学期不能申请第二次，请等到下学期再申请
                                }
                            }
                        }
                    }///***else
                }else{//若从来没申请过
                    flag = 2;//您有资格进行申请，请点击申请
                    return flag;
                }
            }
        } else if (cet6 == 0) {
            return  flag = 0;//6级未参加
        } else {
            return flag = 1;//6级参加过，但没达到425
        }

        return flag;//flag=0；没有资格申请}
    }


    //老师分页查看免修申请  0 未处理  1批准   2 退回
    @Override
    public List<ExemStuAcaTerm> queryAllEmp(PageInfo<ExemStuAcaTerm> pageinfo, int exemption_Flag) {
        List<ExemStuAcaTerm> list = new ArrayList<ExemStuAcaTerm>();
        Long count = null;
        count = exemptionDao.obtainCount();
        pageinfo.setCount(count.intValue());
        pageinfo.setPageIndex((pageinfo.getPageIndex() - 1) * pageinfo.pageSize);
        pageinfo.setPageList(exemptionDao.queryAllEmp(pageinfo.getPageIndex(), pageinfo.pageSize, exemption_Flag));
        return list;
    }

    @Override
    public List<ExemStuAcaTerm> queryOneExe(int exemption_id) {


        List<ExemStuAcaTerm> esa = exemptionDao.queryOneExe(exemption_id);
        System.out.println(exemption_id);

        return esa;
    }

    @Override
    public List<ExemStuAcaTerm> selectExemStuAcaTermByid(int stu_info_id) {
        List<ExemStuAcaTerm> esa = exemptionDao.selectExemStuAcaTermByid(stu_info_id);
        return esa;
    }


}
